home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / brklyprl.lha / Comp / compilefile.pl < prev    next >
Text File  |  1989-04-14  |  4KB  |  164 lines

  1.  
  2. /* Copyright (C) 1988, 1989 Herve' Touati, Aquarius Project, UC Berkeley */
  3.  
  4. /* Copyright Herve' Touati, Aquarius Project, UC Berkeley */
  5.  
  6. % Compile all procedures on a file:
  7. % Uses procedure 'compileclause' from lower level.
  8.  
  9. % This version uses set and access, which are defined in util.garbcoll
  10. % Set/access codes:
  11. %    1: garbage collect
  12. %    2: compiler options
  13. %    3: temporary variable allocation
  14. %    4: Prolog version
  15.  
  16. bim :- set(4, bimprolog).
  17. c   :- set(4, cprolog).
  18. q   :- set(4,quintusprolog).
  19.  
  20. % Compile 'FileName' and put results in 'Filename.w':
  21. % Default: no special options.
  22. plm(FileName) :- !, plm(FileName, []).
  23. plm(FileName, One) :- atomic(One), \+(One=[]), !, plm(FileName, [One]).
  24. plm(FileName, One) :- \+(list(One)), \+(One=[]), !, plm(FileName, [One]).
  25. plm(FileName, OptionList) :-
  26.     q,     % Default is Quintus Prolog
  27.     access(4, cprolog), 
  28.     % Handle options:
  29.     options(FileName, OptionList),
  30.     % Read input file:
  31.     see(FileName), read_clauses(CI), seen,
  32.      write('Finished reading '), write(FileName),nl,
  33.     name(FileName, NL),
  34.     name('.w', DOTW),
  35.     concat(NL, DOTW, OF),
  36.     name(OutFile, OF),
  37.     % Compile & write output file:
  38.     tell(OutFile),
  39.     Start is cputime,
  40.     % for dummy procedures 
  41.     set(dummy_counter,0),
  42.     compileallprocs(CI),
  43.     Time is cputime-Start,
  44.     told,
  45.     write('Total cputime is '),write(Time),nl,
  46.     fail.
  47. plm(FileName, OptionList) :-
  48.     access(4, bimprolog),
  49.     % Handle options:
  50.     options(FileName, OptionList),
  51.     % Read input file:
  52.     see(FileName), read_clauses(CI), seen,
  53.      write('Finished reading '), write(FileName),nl,
  54.     name(FileName, NL),
  55.     name('.w', DOTW),
  56.     concat(NL, DOTW, OF),
  57.     name(OutFile, OF),
  58.     % Compile & write output file:
  59.     tell(OutFile),
  60.     cputime(Start),
  61.     compileallprocs(CI),
  62.     cputime(Stop), Time is Stop-Start,
  63.     told,
  64.     write('Total cputime is '),write(Time),nl,
  65.     fail.
  66. plm(FileName, OptionList) :-
  67.     access(4, quintusprolog),
  68.     % Handle options:
  69.     options(FileName, OptionList),
  70.     % Read input file:
  71.     see(FileName), read_clauses(CI), seen,
  72.      write('Finished reading '), write(FileName),nl,
  73.     name(FileName, NL),
  74.     name('.w', DOTW),
  75.     concat(NL, DOTW, OF),
  76.     name(OutFile, OF),
  77.     % Compile & write output file:
  78.     statistics,
  79.     tell(OutFile),
  80.     compileallprocs(CI),
  81.     told,
  82.     statistics,
  83.     fail.
  84. % Clean up all heap space used.
  85. plm(_, _).
  86.  
  87. % Add options to data base:
  88. options(FileName, OptionList) :-
  89.     set(2,[]),
  90.     atom(FileName),full_list(OptionList), add_options(OptionList), !.
  91. options(FileName, OptionList) :-
  92.     write('First param is name of source file (atom)'),nl,
  93.     write('Second param is one option or a list of options (ground terms)'),
  94.     nl,abort, !.
  95.  
  96. compile_options(X) :- access(2,OptionList), member(X, OptionList), !.
  97.  
  98. add_options([Opt|OptionList]) :-
  99.     nonvar(Opt), !,
  100.     access(2,Options),
  101.     set(2,[Opt|Options]),
  102.     add_options(OptionList).
  103. add_options([]).
  104.  
  105. read_clauses(ClauseInfo) :-
  106.     access(4, cprolog),
  107.     c_read_clauses(ClauseInfo), !.
  108. read_clauses(ClauseInfo) :-
  109.     access(4, quintusprolog),
  110.     c_read_clauses(ClauseInfo), !.
  111. read_clauses(ClauseInfo) :-
  112.     access(4, bimprolog),
  113.     b_read_clauses(ClauseInfo), !.
  114.  
  115. c_read_clauses(ClauseInfo) :- !,
  116.     read(Clause),
  117.     (Clause=end_of_file -> ClauseInfo=[];
  118.         getname(Clause, NameAr),
  119.         ClauseInfo=[source(NameAr,Clause)|Rest],
  120.         c_read_clauses(Rest)), !.
  121.  
  122. b_read_clauses(ClauseInfo) :-
  123.         read(Clause),
  124.         getname(Clause, NameAr),
  125.         ClauseInfo=[source(NameAr,Clause)|Rest],
  126.         b_read_clauses(Rest), !.
  127. b_read_clauses([]).
  128.  
  129.  
  130.  
  131. getname(Clause, Name/Arity) :- !,
  132.     (Clause=(Head:-Body); Clause=Head),
  133.     Head=..[Name|Args],
  134.     my_length(Args, Arity), !.
  135.  
  136. % Generate and write code for all procedures in ClauseInfo:
  137. compileallprocs([]) :-
  138.     alloc_option,
  139.     list_option, !.
  140. compileallprocs(ClauseInfo) :-
  141.     filteroneproc(ClauseInfo, NextCI, NameAr, OneProc),
  142.     eliminate_disjunctions(OneProc,NewProc,NewClauses,Link),
  143.     Link = NextCI,
  144.     gc(compileproc(NameAr, NewProc, Code-[])),
  145.     write_plm(NameAr, Code),
  146.     compileallprocs(NewClauses), !.
  147.  
  148.     % Take care of old-new allocate option:
  149.     alloc_option :-
  150.         compile_options(a),
  151.         not(compile_options(s)),
  152.         write_plm(allocate_dummy/0, [proceed]), !.
  153.     alloc_option.
  154.  
  155.     % Procedure's end:
  156.     list_option :- compile_options(l), !.
  157.     list_option :- write(end), nl, nl, !.
  158.  
  159. filteroneproc([], [], _, []) :- !.
  160. filteroneproc([source(NameAr,C)|Rest], NextCI, NameAr, [C|OneProc]) :-
  161.     filteroneproc(Rest, NextCI, NameAr, OneProc), !.
  162. filteroneproc([source(N,C)|Rest], [source(N,C)|NextCI], NameAr, OneProc) :-
  163.     filteroneproc(Rest, NextCI, NameAr, OneProc), !.
  164.